package main

import "fmt"

//多态
//变量具有多种形态，面向对象的第三大特征，Go语言种，多态特征是通过接口实现的，可以按照统一的接口来调用不同的实现
//这是接口变量就呈现不同的形态

// 定义结构体
type person struct {
	name string
	age  int
}

// 定义接口
type SayHello interface {
	SayHello()
}

// 定义实现接口的结构体
type chinese struct {
	person
}
type American struct {
	person
}

// 定义不同结构体实现接口的方法
func (c chinese) SayHello() {
	fmt.Println("你好")
}
func (a American) SayHello() {
	fmt.Println("hi")
}

// 定义函数专门打招呼  将接口方法作为参数传入
// 多态：表面上定义了接口，其实可以通过接口推断出是中国人和美国人
// 可以按照统一的接口来调用不同的实现，这时变量就呈现不同的形态，也就体现了多态的现象
// s我们称为多态参数
func greet(s SayHello) {
	s.SayHello()
}

func main() {
	c := &chinese{
		person{
			name: "曾宇杰",
			age:  21,
		},
	}
	a := &American{
		person{
			name: "美国人",
			age:  21,
		},
	}

	//其实这里就实现了多态，如果传入中国人，就输出你好，如果传入美国人，就输出hi
	greet(c)
	greet(a)

	//定义多态数组
	var arr [3]SayHello
	arr[0] = chinese{
		person{
			name: "zeng",
			age:  21,
		},
	}

	arr[1] = chinese{
		person{
			name: "yu",
			age:  21,
		},
	}

	arr[2] = American{
		person{
			name: "jie",
			age:  21,
		},
	}

	fmt.Println(arr)
}
